home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Linux / Kubuntu 8.10 / kubuntu-8.10-desktop-i386.iso / casper / filesystem.squashfs / var / lib / dpkg / info / libx11-6.preinst < prev    next >
Text File  |  2008-10-08  |  31KB  |  951 lines

  1. #!/bin/sh
  2. set -e
  3.  
  4. THIS_PACKAGE=libx11-6
  5. THIS_SCRIPT=preinst
  6.  
  7. # $Id$
  8.  
  9. # This is the X Strike Force shell library for X Window System package
  10. # maintainer scripts.  It serves to define shell functions commonly used by
  11. # such packages, and performs some error checking necessary for proper operation
  12. # of those functions.  By itself, it does not "do" much; the maintainer scripts
  13. # invoke the functions defined here to accomplish package installation and
  14. # removal tasks.
  15.  
  16. # If you are reading this within a Debian package maintainer script (e.g.,
  17. # /var/lib/dpkg)info/PACKAGE.{config,preinst,postinst,prerm,postrm}), you can
  18. # skip past this library by scanning forward in this file to the string
  19. # "GOBSTOPPER".
  20.  
  21. SOURCE_VERSION=2:1.1.5-2ubuntu1
  22. OFFICIAL_BUILD=
  23.  
  24. # Use special abnormal exit codes so that problems with this library are more
  25. # easily tracked down.
  26. SHELL_LIB_INTERNAL_ERROR=86
  27. SHELL_LIB_THROWN_ERROR=74
  28. SHELL_LIB_USAGE_ERROR=99
  29.  
  30. # old -> new variable names
  31. if [ -z "$DEBUG_XORG_PACKAGE" ] && [ -n "$DEBUG_XFREE86_PACKAGE" ]; then
  32.   DEBUG_XORG_PACKAGE="$DEBUG_XFREE86_PACKAGE"
  33. fi
  34. if [ -z "$DEBUG_XORG_DEBCONF" ] && [ -n "$DEBUG_XFREE86_DEBCONF" ]; then
  35.   DEBUG_XORG_DEBCONF="$DEBUG_XFREE86_DEBCONF"
  36. fi
  37.  
  38. # initial sanity checks
  39. if [ -z "$THIS_PACKAGE" ]; then
  40.   cat >&2 <<EOF
  41. Error: package maintainer script attempted to use shell library without
  42. definining \$THIS_PACKAGE shell variable.  Please report the package name,
  43. version, and the text of this error message to the Debian Bug Tracking System.
  44. Visit <http://www.debian.org/Bugs/Reporting> on the World Wide Web for
  45. instructions, read the file /usr/share/doc/debian/bug-reporting.txt from the
  46. "doc-debian" package, or install the "reportbug" package and use the command of
  47. the same name to file a report against version $SOURCE_VERSION of this package.
  48. EOF
  49.   exit $SHELL_LIB_USAGE_ERROR
  50. fi
  51.  
  52. if [ -z "$THIS_SCRIPT" ]; then
  53.   cat >&2 <<EOF
  54. Error: package maintainer script attempted to use shell library without
  55. definining \$THIS_SCRIPT shell variable.  Please report the package name,
  56. version, and the text of this error message to the Debian Bug Tracking System.
  57. Visit <http://www.debian.org/Bugs/Reporting> on the World Wide Web for
  58. instructions, read the file /usr/share/doc/debian/bug-reporting.txt from the
  59. "doc-debian" package, or install the "reportbug" package and use the command of
  60. the same name to file a report against version $SOURCE_VERSION of the
  61. "$THIS_PACKAGE" package.
  62. EOF
  63.   exit $SHELL_LIB_USAGE_ERROR
  64. fi
  65.  
  66. ARCHITECTURE="$(dpkg --print-installation-architecture)"
  67.  
  68. if [ "$1" = "reconfigure" ] || [ -n "$DEBCONF_RECONFIGURE" ]; then
  69.   RECONFIGURE="true"
  70. else
  71.   RECONFIGURE=
  72. fi
  73.  
  74. if ([ "$1" = "install" ] || [ "$1" = "configure" ]) && [ -z "$2" ]; then
  75.   FIRSTINST="yes"
  76. fi
  77.  
  78. if [ -z "$RECONFIGURE" ] && [ -z "$FIRSTINST" ]; then
  79.   UPGRADE="yes"
  80. fi
  81.  
  82. trap "message;\
  83.       message \"Received signal.  Aborting $THIS_PACKAGE package $THIS_SCRIPT script.\";\
  84.       message;\
  85.       exit 1" HUP INT QUIT TERM
  86.  
  87. reject_nondigits () {
  88.   # syntax: reject_nondigits [ operand ... ]
  89.   #
  90.   # scan operands (typically shell variables whose values cannot be trusted) for
  91.   # characters other than decimal digits and barf if any are found
  92.   while [ -n "$1" ]; do
  93.     # does the operand contain anything but digits?
  94.     if ! expr "$1" : "[[:digit:]]\+$" > /dev/null 2>&1; then
  95.       # can't use die(), because it wraps message() which wraps this function
  96.       echo "$THIS_PACKAGE $THIS_SCRIPT error: reject_nondigits() encountered" \
  97.            "possibly malicious garbage \"$1\"" >&2
  98.       exit $SHELL_LIB_THROWN_ERROR
  99.     fi
  100.     shift
  101.   done
  102. }
  103.  
  104. reject_whitespace () {
  105.   # syntax: reject_whitespace [ operand ]
  106.   #
  107.   # scan operand (typically a shell variable whose value cannot be trusted) for
  108.   # whitespace characters and barf if any are found
  109.   if [ -n "$1" ]; then
  110.     # does the operand contain any whitespace?
  111.     if expr "$1" : "[[:space:]]" > /dev/null 2>&1; then
  112.       # can't use die(), because I want to avoid forward references
  113.       echo "$THIS_PACKAGE $THIS_SCRIPT error: reject_whitespace() encountered" \
  114.            "possibly malicious garbage \"$1\"" >&2
  115.       exit $SHELL_LIB_THROWN_ERROR
  116.     fi
  117.   fi
  118. }
  119.  
  120. reject_unlikely_path_chars () {
  121.   # syntax: reject_unlikely_path_chars [ operand ... ]
  122.   #
  123.   # scan operands (typically shell variables whose values cannot be trusted) for
  124.   # characters unlikely to be seen in a path and which the shell might
  125.   # interpret and barf if any are found
  126.   while [ -n "$1" ]; do
  127.     # does the operand contain any funny characters?
  128.     if expr "$1" : '.*[!$&()*;<>?|].*' > /dev/null 2>&1; then
  129.       # can't use die(), because I want to avoid forward references
  130.       echo "$THIS_PACKAGE $THIS_SCRIPT error: reject_unlikely_path_chars()" \
  131.            "encountered possibly malicious garbage \"$1\"" >&2
  132.       exit $SHELL_LIB_THROWN_ERROR
  133.     fi
  134.     shift
  135.   done
  136. }
  137.  
  138. # Query the terminal to establish a default number of columns to use for
  139. # displaying messages to the user.  This is used only as a fallback in the
  140. # event the COLUMNS variable is not set.  ($COLUMNS can react to SIGWINCH while
  141. # the script is running, and this cannot, only being calculated once.)
  142. DEFCOLUMNS=$(stty size 2> /dev/null | awk '{print $2}') || true
  143. if ! expr "$DEFCOLUMNS" : "[[:digit:]]\+$" > /dev/null 2>&1; then
  144.   DEFCOLUMNS=80
  145. fi
  146.  
  147. message () {
  148.   # pretty-print messages of arbitrary length
  149.   reject_nondigits "$COLUMNS"
  150.   echo "$*" | fmt -t -w ${COLUMNS:-$DEFCOLUMNS} >&2
  151. }
  152.  
  153. observe () {
  154.   # syntax: observe message ...
  155.   #
  156.   # issue observational message suitable for logging someday when support for
  157.   # it exists in dpkg
  158.   if [ -n "$DEBUG_XORG_PACKAGE" ]; then
  159.     message "$THIS_PACKAGE $THIS_SCRIPT note: $*"
  160.   fi
  161. }
  162.  
  163. warn () {
  164.   # syntax: warn message ...
  165.   #
  166.   # issue warning message suitable for logging someday when support for
  167.   # it exists in dpkg; also send to standard error
  168.   message "$THIS_PACKAGE $THIS_SCRIPT warning: $*"
  169. }
  170.  
  171. die () {
  172.   # syntax: die message ...
  173.   #
  174.   # exit script with error message
  175.   message "$THIS_PACKAGE $THIS_SCRIPT error: $*"
  176.   exit $SHELL_LIB_THROWN_ERROR
  177. }
  178.  
  179. internal_error () {
  180.   # exit script with error; essentially a "THIS SHOULD NEVER HAPPEN" message
  181.   message "internal error: $*"
  182.   if [ -n "$OFFICIAL_BUILD" ]; then
  183.     message "Please report a bug in the $THIS_SCRIPT script of the" \
  184.             "$THIS_PACKAGE package, version $SOURCE_VERSION to the Debian Bug" \
  185.             "Tracking System.  Include all messages above that mention the" \
  186.             "$THIS_PACKAGE package.  Visit " \
  187.             "<http://www.debian.org/Bugs/Reporting> on the World Wide Web for" \
  188.             "instructions, read the file" \
  189.             "/usr/share/doc/debian/bug-reporting.txt from the doc-debian" \
  190.             "package, or install the reportbug package and use the command of" \
  191.             "the same name to file a report."
  192.   fi
  193.   exit $SHELL_LIB_INTERNAL_ERROR
  194. }
  195.  
  196. usage_error () {
  197.   message "usage error: $*"
  198.   message "Please report a bug in the $THIS_SCRIPT script of the" \
  199.           "$THIS_PACKAGE package, version $SOURCE_VERSION to the Debian Bug" \
  200.           "Tracking System.  Include all messages above that mention the" \
  201.           "$THIS_PACKAGE package.  Visit " \
  202.           "<http://www.debian.org/Bugs/Reporting> on the World Wide Web for" \
  203.           "instructions, read the file" \
  204.           "/usr/share/doc/debian/bug-reporting.txt from the doc-debian" \
  205.           "package, or install the reportbug package and use the command of" \
  206.           "the same name to file a report."
  207.   exit $SHELL_LIB_USAGE_ERROR
  208. }
  209.  
  210.  
  211. maplink () {
  212.   # returns what symlink should point to; i.e., what the "sane" answer is
  213.   # Keep this in sync with the debian/*.links files.
  214.   # This is only needed for symlinks to directories.
  215.   #
  216.   # XXX: Most of these look wrong in the X11R7 world and need to be fixed.
  217.   # If we've stopped using this function, fixing it might enable us to re-enable
  218.   # it again and catch more errors.
  219.   case "$1" in
  220.     /etc/X11/xkb/compiled) echo /var/lib/xkb ;;
  221.     /etc/X11/xkb/xkbcomp) echo /usr/X11R6/bin/xkbcomp ;;
  222.     /usr/X11R6/lib/X11/app-defaults) echo /etc/X11/app-defaults ;;
  223.     /usr/X11R6/lib/X11/fs) echo /etc/X11/fs ;;
  224.     /usr/X11R6/lib/X11/lbxproxy) echo /etc/X11/lbxproxy ;;
  225.     /usr/X11R6/lib/X11/proxymngr) echo /etc/X11/proxymngr ;;
  226.     /usr/X11R6/lib/X11/rstart) echo /etc/X11/rstart ;;
  227.     /usr/X11R6/lib/X11/twm) echo /etc/X11/twm ;;
  228.     /usr/X11R6/lib/X11/xdm) echo /etc/X11/xdm ;;
  229.     /usr/X11R6/lib/X11/xinit) echo /etc/X11/xinit ;;
  230.     /usr/X11R6/lib/X11/xkb) echo /etc/X11/xkb ;;
  231.     /usr/X11R6/lib/X11/xserver) echo /etc/X11/xserver ;;
  232.     /usr/X11R6/lib/X11/xsm) echo /etc/X11/xsm ;;
  233.     /usr/bin/X11) echo ../X11R6/bin ;;
  234.     /usr/bin/rstartd) echo ../X11R6/bin/rstartd ;;
  235.     /usr/include/X11) echo ../X11R6/include/X11 ;;
  236.     /usr/lib/X11) echo ../X11R6/lib/X11 ;;
  237.     *) internal_error "maplink() called with unknown path \"$1\"" ;;
  238.   esac
  239. }
  240.  
  241. analyze_path () {
  242.   # given a supplied set of pathnames, break each one up by directory and do an
  243.   # ls -dl on each component, cumulatively; i.e.
  244.   # analyze_path /usr/X11R6/bin -> ls -dl /usr /usr/X11R6 /usr/X11R6/bin
  245.   # Thanks to Randolph Chung for this clever hack.
  246.  
  247.   local f g
  248.  
  249.   while [ -n "$1" ]; do
  250.     reject_whitespace "$1"
  251.     g=
  252.     message "Analyzing $1:"
  253.     for f in $(echo "$1" | tr / \  ); do
  254.       if [ -e /$g$f ]; then
  255.         ls -dl /$g$f /$g$f.dpkg-* 2> /dev/null || true
  256.         g=$g$f/
  257.       else
  258.         message "/$g$f: nonexistent; directory contents of /$g:"
  259.         ls -l /$g
  260.         break
  261.       fi
  262.     done
  263.     shift
  264.   done
  265. }
  266.  
  267. find_culprits () {
  268.   local f p dpkg_info_dir possible_culprits smoking_guns bad_packages package \
  269.     msg
  270.  
  271.   reject_whitespace "$1"
  272.   message "Searching for overlapping packages..."
  273.   dpkg_info_dir=/var/lib/dpkg/info
  274.   if [ -d $dpkg_info_dir ]; then
  275.     if [ "$(echo $dpkg_info_dir/*.list)" != "$dpkg_info_dir/*.list" ]; then
  276.       possible_culprits=$(ls -1 $dpkg_info_dir/*.list | egrep -v \
  277.         "(xbase-clients|x11-common|xfs|xlibs)")
  278.       if [ -n "$possible_culprits" ]; then
  279.         smoking_guns=$(grep -l "$1" $possible_culprits || true)
  280.         if [ -n "$smoking_guns" ]; then
  281.           bad_packages=$(printf "\\n")
  282.           for f in $smoking_guns; do
  283.             # too bad you can't nest parameter expansion voodoo
  284.             p=${f%*.list}      # strip off the trailing ".list"
  285.             package=${p##*/}   # strip off the directories
  286.             bad_packages=$(printf "%s\n%s" "$bad_packages" "$package")
  287.           done
  288.           msg=$(cat <<EOF
  289. The following packages appear to have file overlaps with the X.Org packages;
  290. these packages are either very old, or in violation of Debian Policy.  Try
  291. upgrading each of these packages to the latest available version if possible:
  292. for example, with the command "apt-get install".  If no newer version of a
  293. package is available, you will have to remove it; for example, with the command
  294. "apt-get remove".  If even the latest available version of the package has
  295. this file overlap, please file a bug against that package with the Debian Bug
  296. Tracking System.  You may want to refer the package maintainer to section 12.8
  297. of the Debian Policy manual.
  298. EOF
  299. )
  300.           message "$msg"
  301.           message "The overlapping packages are: $bad_packages"
  302.         else
  303.           message "no overlaps found."
  304.         fi
  305.       fi
  306.     else
  307.       message "cannot search; no matches for $dpkg_info_dir/*.list."
  308.     fi
  309.   else
  310.     message "cannot search; $dpkg_info_dir does not exist."
  311.   fi
  312. }
  313.  
  314. # we require a readlink command or shell function
  315. if ! which readlink > /dev/null 2>&1; then
  316.   message "The readlink command was not found.  Please install version" \
  317.           "1.13.1 or later of the debianutils package."
  318.   readlink () {
  319.     # returns what symlink in $1 actually points to
  320.     perl -e '$l = shift; exit 1 unless -l $l; $r = readlink $l; exit 1 unless $r; print "$r\n"' "$1"
  321.   }
  322. fi
  323.  
  324. check_symlink () {
  325.   # syntax: check_symlink symlink
  326.   #
  327.   # See if specified symlink points where it is supposed to.  Return 0 if it
  328.   # does, and 1 if it does not.
  329.   #
  330.   # Primarily used by check_symlinks_and_warn() and check_symlinks_and_bomb().
  331.  
  332.   local symlink
  333.  
  334.   # validate arguments
  335.   if [ $# -ne 1 ]; then
  336.     usage_error "check_symlink() called with wrong number of arguments;" \
  337.                 "expected 1, got $#"
  338.     exit $SHELL_LIB_USAGE_ERROR
  339.   fi
  340.  
  341.   symlink="$1"
  342.  
  343.   if [ "$(maplink "$symlink")" = "$(readlink "$symlink")" ]; then
  344.     return 0
  345.   else
  346.     return 1
  347.   fi
  348. }
  349.  
  350. check_symlinks_and_warn () {
  351.   # syntax: check_symlinks_and_warn symlink ...
  352.   #
  353.   # For each argument, check for symlink sanity, and warn if it isn't sane.
  354.   #
  355.   # Call this function from a preinst script in the event $1 is "upgrade" or
  356.   # "install".
  357.  
  358.   local errmsg symlink
  359.  
  360.   # validate arguments
  361.   if [ $# -lt 1 ]; then
  362.     usage_error "check_symlinks_and_warn() called with wrong number of" \
  363.                 "arguments; expected at least 1, got $#"
  364.     exit $SHELL_LIB_USAGE_ERROR
  365.   fi
  366.  
  367.   while [ -n "$1" ]; do
  368.     symlink="$1"
  369.     if [ -L "$symlink" ]; then
  370.       if ! check_symlink "$symlink"; then
  371.         observe "$symlink symbolic link points to wrong location" \
  372.                 "$(readlink "$symlink"); removing"
  373.         rm "$symlink"
  374.       fi
  375.     elif [ -e "$symlink" ]; then
  376.       errmsg="$symlink exists and is not a symbolic link; this package cannot"
  377.       errmsg="$errmsg be installed until this"
  378.       if [ -f "$symlink" ]; then
  379.         errmsg="$errmsg file"
  380.       elif [ -d "$symlink" ]; then
  381.         errmsg="$errmsg directory"
  382.       else
  383.         errmsg="$errmsg thing"
  384.       fi
  385.       errmsg="$errmsg is removed"
  386.       die "$errmsg"
  387.     fi
  388.     shift
  389.   done
  390. }
  391.  
  392. check_symlinks_and_bomb () {
  393.   # syntax: check_symlinks_and_bomb symlink ...
  394.   #
  395.   # For each argument, check for symlink sanity, and bomb if it isn't sane.
  396.   #
  397.   # Call this function from a postinst script.
  398.  
  399.   local problem symlink
  400.  
  401.   # validate arguments
  402.   if [ $# -lt 1 ]; then
  403.     usage_error "check_symlinks_and_bomb() called with wrong number of"
  404.                 "arguments; expected at least 1, got $#"
  405.     exit $SHELL_LIB_USAGE_ERROR
  406.   fi
  407.  
  408.   while [ -n "$1" ]; do
  409.     problem=
  410.     symlink="$1"
  411.     if [ -L "$symlink" ]; then
  412.       if ! check_symlink "$symlink"; then
  413.         problem=yes
  414.         warn "$symlink symbolic link points to wrong location" \
  415.              "$(readlink "$symlink")"
  416.       fi
  417.     elif [ -e "$symlink" ]; then
  418.       problem=yes
  419.       warn "$symlink is not a symbolic link"
  420.     else
  421.       problem=yes
  422.       warn "$symlink symbolic link does not exist"
  423.     fi
  424.     if [ -n "$problem" ]; then
  425.       analyze_path "$symlink" "$(readlink "$symlink")"
  426.       find_culprits "$symlink"
  427.       die "bad symbolic links on system"
  428.     fi
  429.     shift
  430.   done
  431. }
  432.  
  433. font_update () {
  434.   # run $UPDATECMDS in $FONTDIRS
  435.  
  436.   local dir cmd shortcmd x_font_dir_prefix
  437.  
  438.   x_font_dir_prefix="/usr/share/fonts/X11"
  439.  
  440.   if [ -z "$UPDATECMDS" ]; then
  441.     usage_error "font_update() called but \$UPDATECMDS not set"
  442.   fi
  443.   if [ -z "$FONTDIRS" ]; then
  444.     usage_error "font_update() called but \$FONTDIRS not set"
  445.   fi
  446.  
  447.   reject_unlikely_path_chars "$UPDATECMDS"
  448.   reject_unlikely_path_chars "$FONTDIRS"
  449.  
  450.   for dir in $FONTDIRS; do
  451.     if [ -d "$x_font_dir_prefix/$dir" ]; then
  452.       for cmd in $UPDATECMDS; do
  453.         if which "$cmd" > /dev/null 2>&1; then
  454.           shortcmd=${cmd##*/}
  455.           observe "running $shortcmd in $dir font directory"
  456.       cmd_opts=
  457.           if [ "$shortcmd" = "update-fonts-alias" ]; then
  458.             cmd_opts=--x11r7-layout
  459.           fi
  460.           if [ "$shortcmd" = "update-fonts-dir" ]; then
  461.             cmd_opts=--x11r7-layout
  462.           fi
  463.           if [ "$shortcmd" = "update-fonts-scale" ]; then
  464.             cmd_opts=--x11r7-layout
  465.           fi
  466.           $cmd $cmd_opts $dir || warn "$cmd $cmd_opts $dir" \
  467.                               "failed; font directory data may not" \
  468.                               "be up to date"
  469.         else
  470.           warn "$cmd not found; not updating corresponding $dir font" \
  471.                "directory data"
  472.         fi
  473.       done
  474.     else
  475.       warn "$dir is not a directory; not updating font directory data"
  476.     fi
  477.   done
  478. }
  479.  
  480. remove_conffile_prepare () {
  481.   # syntax: remove_conffile_prepare filename official_md5sum ...
  482.   #
  483.   # Check a conffile "filename" against a list of canonical MD5 checksums.
  484.   # If the file's current MD5 checksum matches one of the "official_md5sum"
  485.   # operands provided, then prepare the conffile for removal from the system.
  486.   # We defer actual deletion until the package is configured so that we can
  487.   # roll this operation back if package installation fails.
  488.   #
  489.   # Call this function from a preinst script in the event $1 is "upgrade" or
  490.   # "install" and verify $2 to ensure the package is being upgraded from a
  491.   # version (or installed over a version removed-but-not-purged) prior to the
  492.   # one in which the conffile was obsoleted.
  493.  
  494.   local conffile current_checksum
  495.  
  496.   # validate arguments
  497.   if [ $# -lt 2 ]; then
  498.     usage_error "remove_conffile_prepare() called with wrong number of" \
  499.                 "arguments; expected at least 2, got $#"
  500.     exit $SHELL_LIB_USAGE_ERROR
  501.   fi
  502.  
  503.   conffile="$1"
  504.   shift
  505.  
  506.   # does the conffile even exist?
  507.   if [ -e "$conffile" ]; then
  508.     # calculate its checksum
  509.     current_checksum=$(md5sum < "$conffile" | sed 's/[[:space:]].*//')
  510.     # compare it to each supplied checksum
  511.     while [ -n "$1" ]; do
  512.       if [ "$current_checksum" = "$1" ]; then
  513.         # we found a match; move the confffile and stop looking
  514.         observe "preparing obsolete conffile $conffile for removal"
  515.         mv "$conffile" "$conffile.$THIS_PACKAGE-tmp"
  516.         break
  517.       fi
  518.       shift
  519.     done
  520.   fi
  521. }
  522.  
  523. remove_conffile_lookup () {
  524.   # syntax: remove_conffile_lookup package filename
  525.   #
  526.   # Lookup the md5sum of a conffile in dpkg's database, and prepare for removal
  527.   # if it matches the actual file's md5sum.
  528.   #
  529.   # Call this function when you would call remove_conffile_prepare but only
  530.   # want to check against dpkg's status database instead of known checksums.
  531.  
  532.   local package conffile old_md5sum
  533.  
  534.   # validate arguments
  535.   if [ $# -ne 2 ]; then
  536.     usage_error "remove_conffile_lookup() called with wrong number of" \
  537.                 "arguments; expected 1, got $#"
  538.     exit $SHELL_LIB_USAGE_ERROR
  539.   fi
  540.  
  541.   package="$1"
  542.   conffile="$2"
  543.  
  544.   if ! [ -e "$conffile" ]; then
  545.     return
  546.   fi
  547.   old_md5sum="$(dpkg-query -W -f='${Conffiles}' "$package" | \
  548.     awk '{ if (match($0, "^ '"$conffile"' ")) print $2}')"
  549.   if [ -n "$old_md5sum" ]; then
  550.     remove_conffile_prepare "$conffile" "$old_md5sum"
  551.   fi
  552. }
  553.  
  554. remove_conffile_commit () {
  555.   # syntax: remove_conffile_commit filename
  556.   #
  557.   # Complete the removal of a conffile "filename" that has become obsolete.
  558.   #
  559.   # Call this function from a postinst script after having used
  560.   # remove_conffile_prepare() in the preinst.
  561.  
  562.   local conffile
  563.  
  564.   # validate arguments
  565.   if [ $# -ne 1 ]; then
  566.     usage_error "remove_conffile_commit() called with wrong number of" \
  567.                 "arguments; expected 1, got $#"
  568.     exit $SHELL_LIB_USAGE_ERROR
  569.   fi
  570.  
  571.   conffile="$1"
  572.  
  573.   # if the temporary file created by remove_conffile_prepare() exists, remove it
  574.   if [ -e "$conffile.$THIS_PACKAGE-tmp" ]; then
  575.     observe "committing removal of obsolete conffile $conffile"
  576.     rm "$conffile.$THIS_PACKAGE-tmp"
  577.   fi
  578. }
  579.  
  580. remove_conffile_rollback () {
  581.   # syntax: remove_conffile_rollback filename
  582.   #
  583.   # Roll back the removal of a conffile "filename".
  584.   #
  585.   # Call this function from a postrm script in the event $1 is "abort-upgrade"
  586.   # or "abort-install" is  after having used remove_conffile_prepare() in the
  587.   # preinst.
  588.  
  589.   local conffile
  590.  
  591.   # validate arguments
  592.   if [ $# -ne 1 ]; then
  593.     usage_error "remove_conffile_rollback() called with wrong number of" \
  594.                 "arguments; expected 1, got $#"
  595.     exit $SHELL_LIB_USAGE_ERROR
  596.   fi
  597.  
  598.   conffile="$1"
  599.  
  600.   # if the temporary file created by remove_conffile_prepare() exists, move it
  601.   # back
  602.   if [ -e "$conffile.$THIS_PACKAGE-tmp" ]; then
  603.     observe "rolling back removal of obsolete conffile $conffile"
  604.     mv "$conffile.$THIS_PACKAGE-tmp" "$conffile"
  605.   fi
  606. }
  607.  
  608. replace_conffile_with_symlink_prepare () {
  609.   # syntax: replace_conffile_with_symlink_prepare oldfilename newfilename \
  610.   # official_md5sum ...
  611.   #
  612.   # Check a conffile "oldfilename" against a list of canonical MD5 checksums.
  613.   # If the file's current MD5 checksum matches one of the "official_md5sum"
  614.   # operands provided, then prepare the conffile for removal from the system.
  615.   # We defer actual deletion until the package is configured so that we can
  616.   # roll this operation back if package installation fails. Otherwise copy it
  617.   # to newfilename and let dpkg handle it through conffiles mechanism.
  618.   #
  619.   # Call this function from a preinst script in the event $1 is "upgrade" or
  620.   # "install" and verify $2 to ensure the package is being upgraded from a
  621.   # version (or installed over a version removed-but-not-purged) prior to the
  622.   # one in which the conffile was obsoleted.
  623.  
  624.   local conffile current_checksum
  625.  
  626.   # validate arguments
  627.   if [ $# -lt 3 ]; then
  628.     usage_error "replace_conffile_with_symlink_prepare() called with wrong" \
  629.                 " number of arguments; expected at least 3, got $#"
  630.     exit $SHELL_LIB_USAGE_ERROR
  631.   fi
  632.  
  633.   oldconffile="$1"
  634.   shift
  635.   newconffile="$1"
  636.   shift
  637.  
  638.   remove_conffile_prepare "$_oldconffile" "$@"
  639.   # If $oldconffile still exists, then md5sums didn't match.
  640.   # Copy it to new one.
  641.   if [ -f "$oldconffile" ]; then
  642.     cp "$oldconffile" "$newconffile"
  643.   fi
  644.  
  645. }
  646.  
  647. replace_conffile_with_symlink_commit () {
  648.   # syntax: replace_conffile_with_symlink_commit oldfilename
  649.   #
  650.   # Complete the removal of a conffile "oldfilename" that has been
  651.   # replaced by a symlink.
  652.   #
  653.   # Call this function from a postinst script after having used
  654.   # replace_conffile_with_symlink_prepare() in the preinst.
  655.  
  656.   local conffile
  657.  
  658.   # validate arguments
  659.   if [ $# -ne 1 ]; then
  660.     usage_error "replace_conffile_with_symlink_commit() called with wrong" \
  661.                 "number of arguments; expected 1, got $#"
  662.     exit $SHELL_LIB_USAGE_ERROR
  663.   fi
  664.  
  665.   conffile="$1"
  666.  
  667.   remove_conffile_commit "$conffile"
  668. }
  669.  
  670. replace_conffile_with_symlink_rollback () {
  671.   # syntax: replace_conffile_with_symlink_rollback oldfilename newfilename
  672.   #
  673.   # Roll back the replacing of a conffile "oldfilename" with symlink to
  674.   # "newfilename".
  675.   #
  676.   # Call this function from a postrm script in the event $1 is "abort-upgrade"
  677.   # or "abort-install" and verify $2 to ensure the package failed to upgrade
  678.   # from a version (or install over a version removed-but-not-purged) prior
  679.   # to the one in which the conffile was obsoleted.
  680.   # You should have  used replace_conffile_with_symlink_prepare() in the
  681.   # preinst.
  682.  
  683.   local conffile
  684.  
  685.   # validate arguments
  686.   if [ $# -ne 2 ]; then
  687.     usage_error "replace_conffile_with_symlink_rollback() called with wrong" \
  688.                 "number of arguments; expected 2, got $#"
  689.     exit $SHELL_LIB_USAGE_ERROR
  690.   fi
  691.  
  692.   oldconffile="$1"
  693.   newconffile="$2"
  694.  
  695.   remove_conffile_rollback "$_oldconffile"
  696.   if [ -f "$newconffile" ]; then
  697.     rm "$newconffile"
  698.   fi
  699. }
  700.  
  701. run () {
  702.   # syntax: run command [ argument ... ]
  703.   #
  704.   # Run specified command with optional arguments and report its exit status.
  705.   # Useful for commands whose exit status may be nonzero, but still acceptable,
  706.   # or commands whose failure is not fatal to us.
  707.   #
  708.   # NOTE: Do *not* use this function with db_get or db_metaget commands; in
  709.   # those cases the return value of the debconf command *must* be checked
  710.   # before the string returned by debconf is used for anything.
  711.  
  712.   local retval
  713.  
  714.   # validate arguments
  715.   if [ $# -lt 1 ]; then
  716.     usage_error "run() called with wrong number of arguments; expected at" \
  717.                 "least 1, got $#"
  718.     exit $SHELL_LIB_USAGE_ERROR
  719.   fi
  720.  
  721.   "$@" || retval=$?
  722.  
  723.   if [ ${retval:-0} -ne 0 ]; then
  724.     observe "command \"$*\" exited with status $retval"
  725.   fi
  726. }
  727.  
  728. register_x_lib_dir_with_ld_so () {
  729.   # syntax: register_x_lib_dir_with_ld_so
  730.   #
  731.   # Configure the dynamic loader ld.so to search /usr/X11R6/lib for shared
  732.   # libraries.
  733.   #
  734.   # Call this function from the postinst script of a package that places a
  735.   # shared library in /usr/X11R6/lib, before invoking ldconfig.
  736.  
  737.   local dir ldsoconf
  738.  
  739.   dir="/usr/X11R6/lib"
  740.   ldsoconf="/etc/ld.so.conf"
  741.  
  742.   # is the line not already present?
  743.   if ! fgrep -qsx "$dir" "$ldsoconf"; then
  744.     observe "adding $dir directory to $ldsoconf"
  745.     echo "$dir" >> "$ldsoconf"
  746.   fi
  747. }
  748.  
  749. deregister_x_lib_dir_with_ld_so () {
  750.   # syntax: deregister_x_lib_dir_with_ld_so
  751.   #
  752.   # Configure dynamic loader ld.so to not search /usr/X11R6/lib for shared
  753.   # libraries, if and only if no shared libaries remain there.
  754.   #
  755.   # Call this function from the postrm script of a package that places a shared
  756.   # library in /usr/X11R6/lib, in the event "$1" is "remove", and before
  757.   # invoking ldconfig.
  758.  
  759.   local dir ldsoconf fgrep_status cmp_status
  760.  
  761.   dir="/usr/X11R6/lib"
  762.   ldsoconf="/etc/ld.so.conf"
  763.  
  764.   # is the line present?
  765.   if fgrep -qsx "$dir" "$ldsoconf"; then
  766.     # are there any shared objects in the directory?
  767.     if [ "$(echo "$dir"/lib*.so.*.*)" = "$dir/lib*.so.*.*" ]; then
  768.       # glob expansion produced nothing, so no shared libraries are present
  769.       observe "removing $dir directory from $ldsoconf"
  770.       # rewrite the file (very carefully)
  771.       set +e
  772.       fgrep -svx "$dir" "$ldsoconf" > "$ldsoconf.dpkg-tmp"
  773.       fgrep_status=$?
  774.       set -e
  775.       case $fgrep_status in
  776.         0|1) ;; # we don't actually care if any lines matched or not
  777.         *) die "error reading \"$ldsoconf\"; fgrep exited with status" \
  778.           "$fgrep_status" ;;
  779.       esac
  780.       set +e
  781.       cmp -s "$ldsoconf.dpkg-tmp" "$ldsoconf"
  782.       cmp_status=$?
  783.       set -e
  784.       case $cmp_status in
  785.         0) rm "$ldsoconf.dpkg-tmp" ;; # files are identical
  786.         1) mv "$ldsoconf.dpkg-tmp" "$ldsoconf" ;; # files differ
  787.         *) die "error comparing \"$ldsoconf.dpkg-tmp\" to \"$ldsoconf\";" \
  788.           "cmp exited with status $cmp_status" ;;
  789.       esac
  790.     fi
  791.   fi
  792. }
  793.  
  794. make_symlink_sane () {
  795.   # syntax: make_symlink_sane symlink target
  796.   #
  797.   # Ensure that the symbolic link symlink exists, and points to target.
  798.   #
  799.   # If symlink does not exist, create it and point it at target.
  800.   #
  801.   # If symlink exists but is not a symbolic link, back it up.
  802.   #
  803.   # If symlink exists, is a symbolic link, but points to the wrong location, fix
  804.   # it.
  805.   #
  806.   # If symlink exists, is a symbolic link, and already points to target, do
  807.   # nothing.
  808.   #
  809.   # This function wouldn't be needed if ln had an -I, --idempotent option.
  810.  
  811.   # Validate arguments.
  812.   if [ $# -ne 2 ]; then
  813.     usage_error "make_symlink_sane() called with wrong number of arguments;" \
  814.       "expected 2, got $#"
  815.     exit $SHELL_LIB_USAGE_ERROR
  816.   fi
  817.  
  818.   # We could just use the positional parameters as-is, but that makes things
  819.   # harder to follow.
  820.   local symlink target
  821.  
  822.   symlink="$1"
  823.   target="$2"
  824.  
  825.   if [ -L "$symlink" ] && [ "$(readlink "$symlink")" = "$target" ]; then
  826.       observe "link from $symlink to $target already exists"
  827.   else
  828.     observe "creating symbolic link from $symlink to $target"
  829.     mkdir -p "${target%/*}" "${symlink%/*}"
  830.     ln -s -b -S ".dpkg-old" "$target" "$symlink"
  831.   fi
  832. }
  833.  
  834. migrate_dir_to_symlink () {
  835.   # syntax: migrate_dir_to_symlink old_location new_location
  836.   #
  837.   # Per Debian Policy section 6.5.4, "A directory will never be replaced by a
  838.   # symbolic link to a directory or vice versa; instead, the existing state
  839.   # (symlink or not) will be left alone and dpkg will follow the symlink if
  840.   # there is one."
  841.   #
  842.   # We have to do it ourselves.
  843.   #
  844.   # This function moves the contents of old_location, a directory, into
  845.   # new_location, a directory, then makes old_location a symbolic link to
  846.   # new_location.
  847.   #
  848.   # old_location need not exist, but if it does, it must be a directory (or a
  849.   # symlink to a directory).  If it is not, it is backed up.  If new_location
  850.   # exists already and is not a directory, it is backed up.
  851.   #
  852.   # This function should be called from a package's preinst so that other
  853.   # packages unpacked after this one --- but before this package's postinst runs
  854.   # --- are unpacked into new_location even if their payloads contain
  855.   # old_location filespecs.
  856.  
  857.   # Validate arguments.
  858.   if [ $# -ne 2 ]; then
  859.     usage_error "migrate_dir_to_symlink() called with wrong number of"
  860.                 "arguments; expected 2, got $#"
  861.     exit $SHELL_LIB_USAGE_ERROR
  862.   fi
  863.  
  864.   # We could just use the positional parameters as-is, but that makes things
  865.   # harder to follow.
  866.   local new old
  867.  
  868.   old="$1"
  869.   new="$2"
  870.  
  871.   # Is old location a symlink?
  872.   if [ -L "$old" ]; then
  873.     # Does it already point to new location?
  874.     if [ "$(readlink "$old")" = "$new" ]; then
  875.       # Nothing to do; migration has already been done.
  876.       observe "migration of $old to $new already done"
  877.       return 0
  878.     else
  879.       # Back it up.
  880.       warn "backing up symbolic link $old as $old.dpkg-old"
  881.       mv -b "$old" "$old.dpkg-old"
  882.     fi
  883.   fi
  884.  
  885.   # Does old location exist, but is not a directory?
  886.   if [ -e "$old" ] && ! [ -d "$old" ]; then
  887.       # Back it up.
  888.       warn "backing up non-directory $old as $old.dpkg-old"
  889.       mv -b "$old" "$old.dpkg-old"
  890.   fi
  891.  
  892.   observe "migrating $old to $new"
  893.  
  894.   # Is new location a symlink?
  895.   if [ -L "$new" ]; then
  896.     # Does it point the wrong way, i.e., back to where we're migrating from?
  897.     if [ "$(readlink "$new")" = "$old" ]; then
  898.       # Get rid of it.
  899.       observe "removing symbolic link $new which points to $old"
  900.       rm "$new"
  901.     else
  902.       # Back it up.
  903.       warn "backing up symbolic link $new as $new.dpkg-old"
  904.       mv -b "$new" "$new.dpkg-old"
  905.     fi
  906.   fi
  907.  
  908.   # Does new location exist, but is not a directory?
  909.   if [ -e "$new" ] && ! [ -d "$new" ]; then
  910.     warn "backing up non-directory $new as $new.dpkg-old"
  911.     mv -b "$new" "$new.dpkg-old"
  912.   fi
  913.  
  914.   # Create new directory if it does not yet exist.
  915.   if ! [ -e "$new" ]; then
  916.     observe "creating $new"
  917.     mkdir -p "$new"
  918.   fi
  919.  
  920.   # Copy files in old location to new location.  Back up any filenames that
  921.   # already exist in the new location with the extension ".dpkg-old".
  922.   observe "copying files from $old to $new"
  923.   if ! (cd "$old" && cp -a -b -S ".dpkg-old" . "$new"); then
  924.     die "error(s) encountered while copying files from $old to $new"
  925.   fi
  926.  
  927.   # Remove files at old location.
  928.   observe "removing $old"
  929.   rm -r "$old"
  930.  
  931.   # Create symlink from old location to new location.
  932.   make_symlink_sane "$old" "$new"
  933. }
  934.  
  935. # vim:set ai et sw=2 ts=2 tw=80:
  936.  
  937. # GOBSTOPPER: The X Strike Force shell library ends here.
  938.  
  939. case "$1" in
  940.   upgrade)
  941.     if dpkg --compare-versions "$2" le-nl "1:6.2.1+cvs.20050711-1"; then
  942.       if test -L /usr/lib/X11/locale && \
  943.          test "$(readlink /usr/lib/X11/locale)" = "../../share/X11/locale"; then
  944.     echo "Removing /usr/lib/X11/locale symlink."
  945.         rm /usr/lib/X11/locale
  946.         mkdir /usr/lib/X11/locale
  947.       fi
  948.     fi
  949.   ;;
  950. esac
  951.